import { ref, reactive } from "vue";
import { ElMessage } from "element-plus";
import { useRouter, useRoute } from "vue-router";
import { login } from "@/apis/auth.js";
import { getCurrentUser } from "@/apis/userAPI.js";

export function useLogin(formRef) {
	// 路由相关
	const router = useRouter();
	const route = useRoute();

	// 响应式数据
	const loading = ref(false);

	// 表单数据
	const loginForm = reactive({
		username: "admin",
		password: "123456",
	});

	/**
	 * 登录表单验证规则
	 */
	const loginRules = {
		username: [
			{ required: true, message: "请输入用户名", trigger: "blur" },
			{
				min: 5,
				max: 20,
				message: "用户名长度在 5 到 20 个字符",
				trigger: "blur",
			},
		],
		password: [
			{ required: true, message: "请输入密码", trigger: "blur" },
			{
				min: 1,
				max: 20,
				message: "密码长度在 1 到 20 个字符",
				trigger: "blur",
			},
		],
	};

	// 处理登录
	const handleLogin = async () => {
		// 先进行表单校验
		if (!formRef.value) {
			ElMessage.error("表单初始化失败");
			return;
		}

		try {
			// 调用表单的validate方法进行校验
			const isValid = await formRef.value.validate();

			// 如果校验失败，直接返回
			if (!isValid) return;

			// 校验通过，执行登录逻辑
			loading.value = true;
			try {
				const { code, message, data } = await login(loginForm);
				// 检查登录是否成功
				if (code !== 200) return ElMessage.error(message);

				// 存储token
				localStorage.setItem("token", data.token);
				
				// 获取并存储当前用户信息
				try {
					const userInfoResponse = await getCurrentUser();
					if (userInfoResponse.code === 200 && userInfoResponse.data) {
						localStorage.setItem("userInfo", JSON.stringify(userInfoResponse.data));
					}
				} catch (error) {
					console.error("获取用户信息失败:", error);
				}
				
				ElMessage.success("登录成功");

				// 处理重定向
				const redirect = route.query.redirect || "/";
				router.push(redirect);
			} catch (error) {
				// 打印错误信息到控制台，方便调试
				console.error("登录请求失败:", error);
				ElMessage.error(error.message);
			}
		} catch (validationError) {
			// 表单校验失败，Element Plus会自动显示错误提示，这里可以不做额外处理
			console.log("表单校验失败");
		} finally {
			loading.value = false;
		}
	};

	// 返回需要暴露的状态和方法
	return {
		loginForm,
		loginRules,
		loading,
		handleLogin,
	};
}
